/*******************************************************************************
  * 文件：Flameout.c
  * 作者：djy
  * 版本：v1.0.0
  * 日期：2020-11-27
  * 说明：关火控制
*******************************************************************************/
/* 头文件 *********************************************************************/
#include "FireCtrl.h"
#include "StateMachine.h"
#include "DevInfor.h"
#include "Hardware_IO.h"
#include "TimingCtrl.h"
#include "Hardware_Timer.h"
#include "StateMachine.h"
#include "DisplayBoard.h"
#include "DevError.h"
#include "DryFireProtect.h"
#include "main.h"

/* 宏定义 *********************************************************************/
/* 类型定义 *******************************************************************/
/* 变量定义 *******************************************************************/
static FireCtrl_ts sFireCtrl;
/* 函数声明 *******************************************************************/
/* 函数定义 *******************************************************************/

/*******************************************************************************
  * 函数名  ：LeftStoveFlameoutHook_500MS
  * 功  能  ：左灶关火500ms回调
  * 参  数  ：无
  * 返回值  ：无
  * 说  明  ：左灶关火IO输出高电平，持续500ms，输出低电平。
  * 输出高电平时热电偶检测不到数据
*******************************************************************************/
static void LeftStoveFlameoutHook_500MS(void)
{
    if(1 == OS_TimerGetExpiredTimes(&(sFireCtrl.asFireOffTimer[0])))
    {
        // 输出低电平
        Hardware_LeftStoveFlameout(OFF);       
    }
    else if(2 == OS_TimerGetExpiredTimes(&(sFireCtrl.asFireOffTimer[0])))
    {
        // 关闭定时器
        OS_TimerStop(&(sFireCtrl.asFireOffTimer[0]));    
    }
}

/*******************************************************************************
  * 函数名  ：LeftStoveFireOff
  * 功  能  ：左灶关火
  * 参  数  ：无
  * 返回值  ：无
  * 说  明  ：左灶关火IO输出高电平，持续500ms，再输出低电平。输出高电平时热电偶检测
  * 不到数据
*******************************************************************************/
void LeftStoveFireOff(void)
{
  	// 复位防干烧检测
#ifdef CONFIG_DRY_FIRE
	DryFireProtect_Reset();
#endif
  	// 左灶关火标志位置高
  	sFireCtrl.bLeftFireOffFlag = TRUE;
    // 输出高电平
    Hardware_LeftStoveFlameout(ON);
    // 启动定时器
    OS_TimerRestart(&(sFireCtrl.asFireOffTimer[0]),500,LeftStoveFlameoutHook_500MS);
}

/*******************************************************************************
  * 函数名  ：MidStoveFlameoutHook_500MS
  * 功  能  ：中灶关火500ms回调
  * 参  数  ：无
  * 返回值  ：无
  * 说  明  ：中灶关火IO输出高电平，持续500ms，输出低电平。
  * 输出高电平时热电偶检测不到数据
*******************************************************************************/
static void MidStoveFlameoutHook_500MS(void)
{
    if(1 == OS_TimerGetExpiredTimes(&(sFireCtrl.asFireOffTimer[1])))
    {
        // 输出低电平
        Hardware_MidStoveFlameOut(OFF);    
    }
    else if(2 == OS_TimerGetExpiredTimes(&(sFireCtrl.asFireOffTimer[1])))
    {
        // 停止定时器
        OS_TimerStop(&(sFireCtrl.asFireOffTimer[1]));    
    }
}

/*******************************************************************************
  * 函数名  ：MidStoveFireOff
  * 功  能  ：中灶关火
  * 参  数  ：无
  * 返回值  ：无
  * 说  明  ：关火IO输出高电平，持续500ms，再输出低电平。输出高电平时热电偶检测
  * 不到数据
*******************************************************************************/
void MidStoveFireOff(void)
{
  	// 中灶关火标志位置高
  	sFireCtrl.bMidFireOffFlag = TRUE;
    // 输出高电平
    Hardware_MidStoveFlameOut(ON);
    // 启动定时器
    OS_TimerRestart(&(sFireCtrl.asFireOffTimer[1]),500,MidStoveFlameoutHook_500MS);
}

/*******************************************************************************
  * 函数名  ：RightStoveFlameoutHook_500MS
  * 功  能  ：右灶关火500ms回调
  * 参  数  ：无
  * 返回值  ：无
  * 说  明  ：右灶关火IO输出高电平，持续500ms，输出低电平。
  * 输出高电平时热电偶检测不到数据
*******************************************************************************/
static void RightStoveFlameoutHook_500MS(void)
{
    if(1 == OS_TimerGetExpiredTimes(&(sFireCtrl.asFireOffTimer[2])))
    {
        // 输出低电平
        Hardware_RightStoveFlameOut(OFF);        
    }
    else if(2 == OS_TimerGetExpiredTimes(&(sFireCtrl.asFireOffTimer[2])))
    {
        // 停止定时器
        OS_TimerStop(&(sFireCtrl.asFireOffTimer[2]));     
    }
}

/*******************************************************************************
  * 函数名  ：RightStoveFireOff
  * 功  能  ：右灶关火
  * 参  数  ：无
  * 返回值  ：无
  * 说  明  ：关火IO输出高电平，持续500ms，再输出低电平。输出高电平时热电偶检测
  * 不到数据
*******************************************************************************/
void RightStoveFireOff(void)
{
  	// 右灶关火标志位置高
  	sFireCtrl.bRightFireOffFlag = TRUE;
    // 输出高电平
    Hardware_RightStoveFlameOut(ON);
    // 启动定时器
    OS_TimerRestart(&(sFireCtrl.asFireOffTimer[2]),500,RightStoveFlameoutHook_500MS);    
}

/*******************************************************************************
  * 函数名：RightStoveFlameoutCheckHook_1S
  * 功  能：右灶意外熄火检测定时器
  * 参  数：无
  * 返回值：无
  * 说  明：1.右灶成功点火后，开启意外熄火检测
  *        2.关火标志未置一，且旋钮开关闭合且点动开关未闭合，认为意外熄火。
*******************************************************************************/
static void RightStoveFlameoutCheckHook_1S(void)
{
    // 点动开关断开，旋钮开关闭合，没有关火，不在点火周期，不在关火周期 
   	if(1 == Hardware_RightStoveJogSwitchCheck() 
         && 0 == Hardware_RightStoveKnobCheck()
            && FALSE == CheckRightFireOffFlag()
                && FALSE == CheckInFireOnPeriod()
                    && FALSE == CheckInFireOffPeriod())
    {
        // 灶火熄灭认为是意外熄火
        if(eFIRE_OFF == Dev_GetRightFireState())
        {
            // 持续超过20秒钟
            if(20 <= OS_TimerGetExpiredTimes(&(sFireCtrl.asFireOnTimer[2]))           
                && eDEV_ERROR != StateMachine_GetCurState()
                        && FALSE == Dev_CheckDemoModeFlag() )
            {
                // 设置故障类型
                Dev_SetErrorType(eERR_RIGHT,eERR_FLAMEOUT);
                // 切换至故障模式
                StateMachine_Change(eDEV_ERROR);   
                // 关闭定时器
                OS_TimerStop(&(sFireCtrl.asFireOnTimer[2]));
            }

            if(ON == Timing_CheckRightTimingRun())
            {
                // 停止定时
                Timing_StopRightTiming();
            }
        }
        else if(eFIRE_ON == Dev_GetRightFireState())
        {
            OS_TimerClearExpiredTimes(&(sFireCtrl.asFireOnTimer[2]));
        }
    }  
    else
    {
        OS_TimerClearExpiredTimes(&(sFireCtrl.asFireOnTimer[2]));
    }
}

/*******************************************************************************
  * 函数名：RightStoveFireOnHook_1S
  * 功  能：右灶点火1S定时任务
  * 参  数：无
  * 返回值：无
  * 说  明：1.点动开关弹起后启动1S定时任务
  *     2.3S后关闭脉冲器，8S后关闭吸阀，根据其他灶头状态关闭瞬燃，点火周期结束
  *     3.10S后检测点火是否成功，若成功则启动意外熄火检测，若失败则报点火失败
*******************************************************************************/
static void RightStoveFireOnHook_1S(void)
{
    if(3 == OS_TimerGetExpiredTimes(&(sFireCtrl.asFireOnTimer[2])))
    {
        // 3S时间到，关闭脉冲器
        Hardware_RightStoveIgnite(OFF);
    }
	else if(8 == OS_TimerGetExpiredTimes(&(sFireCtrl.asFireOnTimer[2])))
	{
	  	// 8S时间到，点火标志位置低，右灶点火周期结束
	    sFireCtrl.bRightFireOnFlag = 0;

	    // 判断左灶和中灶点火周期是否结束
        if(FALSE == sFireCtrl.bLeftFireOnFlag
            && FALSE == sFireCtrl.bMidFireOnFlag)
        {
            // 中灶、左灶点火周期结束，关闭瞬燃
            Hardware_SRFYCtrl(1);
        }

        // 关闭吸阀
        Hardware_RightStoveDrawValve(OFF);
	}
    else if(120 < OS_TimerGetExpiredTimes(&(sFireCtrl.asFireOnTimer[2])))
    {
        // 启动定时器，检测右灶是否点火成功
        OS_TimerRestart(&(sFireCtrl.asFireOnTimer[2]),u16SEC_TO_MSEC,RightStoveFlameoutCheckHook_1S);
    }
}

/*******************************************************************************
  * 函数名：RightStoveFireOnTask
  * 功  能：右灶点火检测任务
  * 参  数：无
  * 返回值：无
  * 说  明：1.上电后不断检测电动开关和旋钮开关闭合，均闭合后开始点火
*******************************************************************************/
static void RightStoveFireOnTask(void)
{
  	if(OFF == Dev_GetPowerState())
    {
        // 电源未开，提前退出
        return;
    }
    
    // 检测旋钮开关和点动开关均闭合，启动点火
    if(0 == Hardware_RightStoveJogSwitchCheck() 
        && 0 == Hardware_RightStoveKnobCheck())
    {
        // 点火标志位置1
        sFireCtrl.bRightFireOnFlag = 1;
	    // 关火标志位置0
        sFireCtrl.bRightFireOffFlag = 0;
        // 置低关火引脚
        Hardware_RightStoveFlameOut(OFF);
        // 开启脉冲器
        Hardware_RightStoveIgnite(ON);
        // 吸阀
        Hardware_RightStoveDrawValve(ON);
        // 开启瞬燃
        Hardware_SRFYCtrl(0);
        // 复位定时器
        OS_TimerRestart(&(sFireCtrl.asFireOnTimer[2]), 
                        u16SEC_TO_MSEC,
                        RightStoveFireOnHook_1S);
    }
    // 旋钮开关和点动开关同时断开，关闭右灶头
    else if(1 == Hardware_RightStoveJogSwitchCheck() 
                && 1 == Hardware_RightStoveKnobCheck())
    {
        // 点火标志清零
        sFireCtrl.bRightFireOnFlag = 0;
	    // 关火标志位置一
        sFireCtrl.bRightFireOffFlag = 1;
        // 关闭脉冲器放电
        Hardware_RightStoveIgnite(OFF);
        // 关闭吸阀
        Hardware_RightStoveDrawValve(OFF);
        
        // 判断左灶和中灶点火周期是否结束
        if(FALSE == sFireCtrl.bLeftFireOnFlag
            && FALSE == sFireCtrl.bMidFireOnFlag)
        {
            // 中灶、左灶点火周期结束，关闭瞬燃
            Hardware_SRFYCtrl(1);
        }
        
		// 判断定时模式是否运行
        if(ON == Timing_CheckRightTimingRun() || Timing_CheckRightTimingExpire())
        {
            // 左定时运行中，结束定时
            Timing_StopRightTiming();
        }

        // 判断右灶是否处于故障模式，或整机处于故障模式且三头全关
        if(eDEV_ERROR == StateMachine_GetCurState()
            &&(eERR_RIGHT == Dev_GetErrorPos()
                || (eERR_ALL == Dev_GetErrorPos()
                      && TRUE == sFireCtrl.bLeftFireOffFlag
                        && TRUE == sFireCtrl.bMidFireOffFlag
                           && TRUE == sFireCtrl.bRightFireOffFlag)))
        {
            // 退出故障模式
            DevErrorExit();
        }
        // 关闭定时器
        OS_TimerStop(&(sFireCtrl.asFireOnTimer[2]));
    }
}

/*******************************************************************************
  * 函数名：MidStoveFlameoutCheckHook_1S
  * 功  能：中灶意外熄火检测定时器
  * 参  数：无
  * 返回值：无
  * 说  明：1.中灶成功点火后，开启意外熄火检测
  *        2.关火标志未置一，且旋钮开关闭合且点动开关未闭合，认为意外熄火。
*******************************************************************************/
static void MidStoveFlameoutCheckHook_1S(void)
{
    // 点动开关断开，旋钮开关闭合，没有关火，不在点火周期，不在关火周期 
   	if(1 == Hardware_MidStoveJogSwitchCheck() 
         && 0 == Hardware_MidStoveKnobCheck()
            && FALSE == CheckMidFireOffFlag()
                && FALSE == CheckInFireOnPeriod()
                    && FALSE == CheckInFireOffPeriod())
    {
        // 灶火熄灭认为是意外熄火
        if(eFIRE_OFF == Dev_GetMidFireState())
        {
            // 持续超过20秒钟
            if(20 <= OS_TimerGetExpiredTimes(&(sFireCtrl.asFireOnTimer[1]))
                && eDEV_ERROR != StateMachine_GetCurState()
                        && FALSE == Dev_CheckDemoModeFlag() )
            {
                // 设置故障类型
                Dev_SetErrorType(eERR_MID,eERR_FLAMEOUT);
                // 切换至故障模式
                StateMachine_Change(eDEV_ERROR);   
                // 关闭定时器
                OS_TimerStop(&(sFireCtrl.asFireOnTimer[1]));
            }

            if(ON == Timing_CheckMidTimingRun())
            {
                // 停止定时
                Timing_StopMidTiming();
            }
        }
        else if(eFIRE_ON == Dev_GetMidFireState())
        {
            OS_TimerClearExpiredTimes(&(sFireCtrl.asFireOnTimer[1]));
        }
    }  
    else
    {
        OS_TimerClearExpiredTimes(&(sFireCtrl.asFireOnTimer[1]));
    }
}

/*******************************************************************************
  * 函数名：MidStoveFireOnHook_1S
  * 功  能：中灶点火1S定时任务
  * 参  数：无
  * 返回值：无
  * 说  明：1.点动开关弹起后启动1S定时任务；
  *			2.3S后关闭脉冲器，5S后可以检测热电偶，8S后关闭吸阀，
  *			3.根据其他灶头状态关闭PWM瞬燃，若8S没点火成功，则报点火失败故障。
*******************************************************************************/
static void MidStoveFireOnHook_1S(void)
{
    if(3 == OS_TimerGetExpiredTimes(&(sFireCtrl.asFireOnTimer[1])))
    {
        // 3S时间到，关闭脉冲器
        Hardware_MidStoveIgnite(OFF);
    }
	else if(8 == OS_TimerGetExpiredTimes(&(sFireCtrl.asFireOnTimer[1])))
	{
	  	// 8S时间到，点火标志位置低，中灶点火周期结束
	    sFireCtrl.bMidFireOnFlag = FALSE;

	    // 判断左灶和右灶点火周期是否结束
        if(FALSE == sFireCtrl.bLeftFireOnFlag
            && FALSE == sFireCtrl.bRightFireOnFlag)
        {
            // 中灶、右灶点火周期结束，关闭瞬燃
            Hardware_SRFYCtrl(1);
        }

        // 关闭吸阀
        Hardware_MidStoveDrawValve(OFF);
	}
    else if(120 < OS_TimerGetExpiredTimes(&(sFireCtrl.asFireOnTimer[1])))
    {
        // 启动点火成功检测
        OS_TimerRestart(&(sFireCtrl.asFireOnTimer[1]),u16SEC_TO_MSEC,MidStoveFlameoutCheckHook_1S);
    }   
}

/*******************************************************************************
  * 函数名：MidStoveFireOnTask
  * 功  能：中灶点火检测任务
  * 参  数：无
  * 返回值：无
  * 说  明：上电后不断检测电动开关和旋钮开关闭合，均闭合后开始点火
*******************************************************************************/
static void MidStoveFireOnTask(void)
{
  	if(OFF == Dev_GetPowerState())
    {
        // 电源未开，提前退出
        return;
    }
    
    // 检测旋钮开关和点动开关同时闭合
    if(0 == Hardware_MidStoveJogSwitchCheck() 
        && 0 == Hardware_MidStoveKnobCheck())
    {
	  	// 点火标志置一
	    sFireCtrl.bMidFireOnFlag = 1;
	    // 关火标志位清零
        sFireCtrl.bMidFireOffFlag = 0;
        // 置低关火引脚
        Hardware_MidStoveFlameOut(OFF);
        // 开启脉冲器
        Hardware_MidStoveIgnite(ON);
        // 吸阀
        Hardware_MidStoveDrawValve(ON);
        // 开启瞬燃
        Hardware_SRFYCtrl(0);
        // 重启定时器
        OS_TimerRestart(&(sFireCtrl.asFireOnTimer[1]), 
                        u16SEC_TO_MSEC,
                        MidStoveFireOnHook_1S);
    }
    // 旋钮开关和点动开关同时断开
    else if(1 == Hardware_MidStoveJogSwitchCheck() 
                && 1 == Hardware_MidStoveKnobCheck())
    {
	    // 关火标志位置一
        sFireCtrl.bMidFireOffFlag = 1;
	  	// 点火标志清零
	    sFireCtrl.bMidFireOnFlag = 0;
        // 关闭脉冲器放电
        Hardware_MidStoveIgnite(OFF);
        // 关闭吸阀
        Hardware_MidStoveDrawValve(OFF);
        
        // 判断左灶和右灶点火周期是否结束
        if(FALSE == sFireCtrl.bLeftFireOnFlag
            && FALSE == sFireCtrl.bRightFireOnFlag)
        {
            // 中灶、右灶点火周期结束，关闭瞬燃
            Hardware_SRFYCtrl(1);
        }
        
		// 判断定时模式是否运行
        if(ON == Timing_CheckMidTimingRun() || Timing_CheckMidTimingExpire())
        {
            // 左定时运行中，结束定时
            Timing_StopMidTiming();
        }

        // 判断中灶是否处于故障模式，或整机处于故障模式且三头全关
        if(eDEV_ERROR == StateMachine_GetCurState()
            &&(eERR_MID == Dev_GetErrorPos()
                || (eERR_ALL == Dev_GetErrorPos()
                      && TRUE == sFireCtrl.bLeftFireOffFlag
                        && TRUE == sFireCtrl.bMidFireOffFlag
                           && TRUE == sFireCtrl.bRightFireOffFlag)))
        {
            // 退出故障模式
            DevErrorExit();
        }
        // 关闭定时器
        OS_TimerStop(&(sFireCtrl.asFireOnTimer[1]));
    }
}

/*******************************************************************************
  * 函数名：LeftStoveFlameoutCheckHook_1S
  * 功  能：左灶意外熄火检测定时器
  * 参  数：无
  * 返回值：无
  * 说  明：1.左灶成功点火后，开启意外熄火检测
  *        2.关火标志未置一，且旋钮开关闭合且点动开关未闭合，认为意外熄火。
*******************************************************************************/
static void LeftStoveFlameoutCheckHook_1S(void)
{
    // 点动开关断开，旋钮开关闭合，没有关火，不在点火周期，不在关火周期 
   	if(1 == Hardware_LeftStoveJogSwitchCheck() 
         && 0 == Hardware_LeftStoveKnobCheck()
            && FALSE == CheckLeftFireOffFlag()
                && FALSE == CheckInFireOnPeriod()
                    && FALSE == CheckInFireOffPeriod())
    {
        // 灶火熄灭认为是意外熄火
        if(eFIRE_OFF == Dev_GetLeftFireState())
        {
            // 持续超过20秒钟
            if(20 < OS_TimerGetExpiredTimes(&(sFireCtrl.asFireOnTimer[0]))
                && eDEV_ERROR != StateMachine_GetCurState()
                        && FALSE == Dev_CheckDemoModeFlag() )
            {
                // 设置故障类型,意外熄火
                Dev_SetErrorType(eERR_LEFT,eERR_FLAMEOUT);
                // 切换至故障模式
                StateMachine_Change(eDEV_ERROR);   
                // 关闭定时器
                OS_TimerStop(&(sFireCtrl.asFireOnTimer[0]));
            }

            if(ON == Timing_CheckLeftTimingRun())
            {
                // 停止定时
                Timing_StopLeftTiming();
            }
        }
        else if(eFIRE_ON == Dev_GetLeftFireState())
        {
            // 清空定时器到期次数
            OS_TimerClearExpiredTimes(&(sFireCtrl.asFireOnTimer[0]));
        }
    }  
    else
    {
        // 清空定时器到期次数
        OS_TimerClearExpiredTimes(&(sFireCtrl.asFireOnTimer[0]));
    }
}

/*******************************************************************************
  * 函数名：LeftStoveFireOnHook_1S
  * 功  能：左灶点火1S定时任务
  * 参  数：无
  * 返回值：无
  * 说  明：1.点动开关弹起后启动1S定时任务；
  *			2.3S后关闭脉冲器，5S后可以检测热电偶，8S后关闭吸阀，
  *			3.根据其他灶头状态关闭PWM瞬燃，若8S没点火成功，则报点火失败故障。
*******************************************************************************/
static void LeftStoveFireOnHook_1S(void)
{
    if(3 == OS_TimerGetExpiredTimes(&(sFireCtrl.asFireOnTimer[0])))
    {
        // 3S时间到，关闭脉冲器
        Hardware_LeftStoveIgnite(OFF);
    }
    else if(8 == OS_TimerGetExpiredTimes(&(sFireCtrl.asFireOnTimer[0])))
    {
        //  8S时间到，清空点火标志位，左灶点火周期已结束
        sFireCtrl.bLeftFireOnFlag = FALSE;

        // 判断中灶和右灶点火周期是否结束
        if(FALSE == sFireCtrl.bMidFireOnFlag
            && FALSE == sFireCtrl.bRightFireOnFlag)
        {
            // 中灶、右灶点火周期结束，关闭瞬燃
            Hardware_SRFYCtrl(1);
        }
        
        // 关闭吸阀
        Hardware_LeftStoveDrawValve(OFF);
    }
    else if(120 < OS_TimerGetExpiredTimes(&(sFireCtrl.asFireOnTimer[0])))
    {
        // 放电2min后，启动意外熄火检测
        OS_TimerRestart(&(sFireCtrl.asFireOnTimer[0]),u16SEC_TO_MSEC,LeftStoveFlameoutCheckHook_1S);
    }
}

/*******************************************************************************
  * 函数名：LeftStoveFireOnTask
  * 功  能：左灶点火检测任务
  * 参  数：无
  * 返回值：无
  * 说  明：上电后不断检测电动开关和旋钮开关闭合，均闭合后开始点火
*******************************************************************************/
static void LeftStoveFireOnTask(void)
{
  	if(OFF == Dev_GetPowerState())
    {
        // 电源未开，提前退出
        return;
    }
    
    // 检测旋钮开关和点动开关同时闭合
    if(0 == Hardware_LeftStoveJogSwitchCheck() 
        && 0 == Hardware_LeftStoveKnobCheck())
    {
	  	// 左灶点火标志位置一
	    sFireCtrl.bLeftFireOnFlag = TRUE;
		// 左灶关火标志位置0
        sFireCtrl.bLeftFireOffFlag = FALSE;
        // 置低关火引脚
        Hardware_LeftStoveFlameout(OFF);
        // 左灶点火，开启脉冲器
        Hardware_LeftStoveIgnite(ON);
        // 左灶吸阀
        Hardware_LeftStoveDrawValve(ON);
        // 开启瞬燃
        Hardware_SRFYCtrl(0);
		// 复位防干烧检测
#ifdef CONFIG_DRY_FIRE
		DryFireProtect_Reset();
#endif
        // 重启定时器
        OS_TimerRestart(&(sFireCtrl.asFireOnTimer[0]), 
                        u16SEC_TO_MSEC,
                        LeftStoveFireOnHook_1S);
    }
    // 旋钮开关和点动开关同时断开
    else if(1 == Hardware_LeftStoveJogSwitchCheck() 
                && 1 == Hardware_LeftStoveKnobCheck())
    {
	 	// 左灶点火标志位置0
	    sFireCtrl.bLeftFireOnFlag = FALSE;
        // 左灶关火标志位置一
        sFireCtrl.bLeftFireOffFlag = TRUE;
        // 关闭脉冲器放电
        Hardware_LeftStoveIgnite(OFF);
        // 关闭吸阀
        Hardware_LeftStoveDrawValve(OFF);
        
        // 判断中灶和右灶点火周期是否结束
        if(FALSE == sFireCtrl.bMidFireOnFlag
            && FALSE == sFireCtrl.bRightFireOnFlag)
        {
            // 中灶、右灶点火周期结束，关闭瞬燃
            Hardware_SRFYCtrl(1);
        }
        
		// 判断定时模式是否运行
        if(ON == Timing_CheckLeftTimingRun() || Timing_CheckLeftTimingExpire())
        {
            // 左定时运行中，结束定时
            Timing_StopLeftTiming();
        }

        // 判断左灶是否处于故障模式，或整机处于故障模式且三头全关
        if(eDEV_ERROR == StateMachine_GetCurState()
            &&(eERR_LEFT == Dev_GetErrorPos()
                || (eERR_ALL == Dev_GetErrorPos()
                      && TRUE == sFireCtrl.bLeftFireOffFlag
                        && TRUE == sFireCtrl.bMidFireOffFlag
                           && TRUE == sFireCtrl.bRightFireOffFlag)))
        {
            // 退出故障模式
            DevErrorExit();
        }
        
        // 关闭定时器
        OS_TimerStop(&(sFireCtrl.asFireOnTimer[0]));
    }
}

/*******************************************************************************
  * 函数名：FireOn_Init
  * 功  能：点火控制初始化
  * 参  数：无
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void FireOn_Init(void)
{
  	// 点火标志默认置0
  	sFireCtrl.bMidFireOnFlag   = FALSE;
	sFireCtrl.bLeftFireOnFlag  = FALSE;
	sFireCtrl.bRightFireOnFlag = FALSE;
	
    // 关火标志位默认置1
    sFireCtrl.bLeftFireOffFlag  = TRUE;
    sFireCtrl.bMidFireOffFlag   = TRUE;
    sFireCtrl.bRightFireOffFlag = TRUE;
    
    // 关闭左、中、右点火定时器
    OS_TimerStop(&(sFireCtrl.asFireOnTimer[0]));
    OS_TimerStop(&(sFireCtrl.asFireOnTimer[1]));
    OS_TimerStop(&(sFireCtrl.asFireOnTimer[2]));
    
    // 启动左、中、右点火检测任务
    OS_TaskCreate(LeftStoveFireOnTask);
    OS_TaskCreate(MidStoveFireOnTask);
    OS_TaskCreate(RightStoveFireOnTask);
}

/*******************************************************************************
  * 函数名：CheckLeftFireOffFlag
  * 功  能：查询左灶关火标志位
  * 参  数：无
  * 返回值：Bool:左灶关火标志位
  * 说  明：当左灶关火标志位置一时，暂停热电偶检测，灶火状态强制置为熄火
*******************************************************************************/
Bool CheckLeftFireOffFlag(void)
{
	return sFireCtrl.bLeftFireOffFlag;
}

/*******************************************************************************
  * 函数名：CheckRightFireOffFlag
  * 功  能：查询右灶关火标志位
  * 参  数：无
  * 返回值：Bool:右灶关火标志位
  * 说  明：当右灶关火标志位置一时，暂停热电偶检测，灶火状态强制置为熄火
*******************************************************************************/
Bool CheckRightFireOffFlag(void)
{
  	return sFireCtrl.bRightFireOffFlag;
}

/*******************************************************************************
  * 函数名：CheckMidFireOffFlag
  * 功  能：查询中灶关火标志位
  * 参  数：无
  * 返回值：Bool:中灶关火标志位
  * 说  明：当中灶关火标志位置一时，暂停热电偶检测，灶火状态强制置为熄火
*******************************************************************************/
Bool CheckMidFireOffFlag(void)
{
  	return sFireCtrl.bMidFireOffFlag;
}

/*******************************************************************************
  * 函数名：CheckInFireOnPeriod
  * 功  能：查询是否处于点火周期
  * 参  数：无
  * 返回值：Bool:否处于点火周期
  * 说  明：灶头点火周期持续八秒钟，任一灶头处于点火周期即返回TRUE;
*******************************************************************************/
Bool CheckInFireOnPeriod(void)
{
  	if(sFireCtrl.bLeftFireOnFlag 
	   	|| sFireCtrl.bMidFireOnFlag
		  	|| sFireCtrl.bRightFireOnFlag)
	{
	  	// 左中右灶任意一个处于点火周期
	  	return TRUE;
	}
	else
	{
	  	return FALSE;
	}
}

/*******************************************************************************
  * 函数名：CheckInFireOffPeriod
  * 功  能：查询是否处于关火周期
  * 参  数：无
  * 返回值：Bool:否处于关火周期
  * 说  明：灶头点火周期持续1秒钟，任一灶头处于点火周期即返回TRUE;
*******************************************************************************/
Bool CheckInFireOffPeriod(void)
{
  	if(TRUE == OS_TimerIsActive(&(sFireCtrl.asFireOffTimer[0]))
	   	|| TRUE == OS_TimerIsActive(&(sFireCtrl.asFireOffTimer[1]))
		  	||TRUE == OS_TimerIsActive(&(sFireCtrl.asFireOffTimer[2])))
	{
	  	return TRUE;
	}
	else
	{
	  	return FALSE;
	}
}

/***************************** 文件结束 ***************************************/

